#include <stdio.h>  // 标准输入输出
#include <stdlib.h> // 标准函数库
#include <string.h> // 字符串处理(操作字符数组)
#include <unistd.h> // POSIX标准接口

#include "ohos_init.h"
#include "cmsis_os2.h" // CMSIS-RTOS API V2

// #include "hdf_log.h"
#include "iot_gpio.h" // OpenHarmony API：IoT硬件设备操作接口-GPIO
#include "hi_io.h"    // 海思 Pegasus SDK：IoT硬件设备操作接口-IO
#include "hi_pwm.h"   // 海思 Pegasus SDK：IoT硬件设备操作接口-PWM
#include "hi_uart.h"  // 海思 Pegasus SDK：IoT硬件设备操作接口-urat
#include "hi_gpio.h"  // 海思 Pegasus SDK：IoT硬件设备操作接口-gpio

// 相关api
// 初始化，配置一个UART设备
// unsigned int IoTUartInit(unsigned int id, const IotUartAttribute *param);
// 从UART设备中读取数据
// int IoTUartRead(unsigned int id, unsigned char *data, unsigned int dataLen);
// 将数据写入UART设备
// int IoTUartWrite(unsigned int id, const unsigned char *data, unsigned int dataLen);

void InitTrafficUart(void);
void SetTrafficUart(int color, int state);

#define UART_RX_GPIO 0 // UART串口使用的RX口
#define UART_TX_GPIO 1 // UART串口使用的TX口

#define BEIDOU_UART_IDX 1;

// 用于北斗通信的串口
static hi_uart_attribute param;

static hi_uart_extra_attr extra_att;

// void UartTestSample(void)
// {
//     static char datas[2048] ;
//     int datas_len = 2048 ;
//     unsigned int len = 0;
//     printf("anran wait uart");
//     // int IoTUartRead(unsigned int id, unsigned char *data, unsigned int dataLen);
//     int id =  BEIDOU_UART_IDX;
//     // HI_ERR_FAILURE
//     while (1)
//     {
//         len = hi_uart_read(id,datas,datas_len);
//         if(len == HI_ERR_FAILURE)
//             printf("GPS datas = ERROR \n");
//         else if(len > 0 )
//             printf("GPS datas = %s \n",datas);
//         else if(len == 0 )
//             printf("GPS datas 0 = %s \n",datas);
//         // 休眠1秒
//         usleep(100000);
//     }

// }

// 这段代码是从GPS传感器获取数据
// 需要保证获取到的数据必须是整行的


#define LAST_STR_SIZE 1024
int readGPS(char *datas, int datas_len)
{

    /***初始化内存空间***/
    static char lastStr[LAST_STR_SIZE] = {} ; 
    // 上次数据的遗留字符串
    // 当此数据的字符串总长度
    unsigned int lastLen = strlen(lastStr);


    /***下方为获取新的字符串***/
    // 当此数据的字符串总长度
    unsigned int len = 0;
    // 将本次数据拼接在上次数据之后获取
    int id = BEIDOU_UART_IDX;
    len = hi_uart_read(id, lastStr+lastLen, LAST_STR_SIZE-lastLen);// int IoTUartRead(unsigned int id, unsigned char *data, unsigned int dataLen);


    // printf("lastStr = %s \0",lastStr);

    //从后往前'/n'所在的位置
    int end_n = len+lastLen;
    for(;end_n>lastLen && lastStr[end_n]!='\n';end_n--){
        
    }


    // 如果没有获取到'/n'本次数据不输出
    if(end_n < lastLen ) {
        datas[0] = 0 ; 
        return 0 ;
    }
    
    /***如果获取到了'\n'就把'\n'前的数据全部输出 ，之后的数据保留在内存中***/


    // printf("no - endl \n");
    lastStr[end_n] = '\0' ;
    strcpy(datas,lastStr) ; 

    strcpy(lastStr,lastStr+end_n+1) ; 


    return end_n;
}
void InitGPS(void)
{
    // 初始化GPIO模块
    IoTGpioInit(UART_TX_GPIO);
    IoTGpioInit(UART_RX_GPIO);

    // 设置UART_TX_GPIO的GPIO能力
    hi_io_set_func(UART_TX_GPIO, HI_IO_FUNC_GPIO_0_UART1_TXD);
    hi_io_set_func(UART_RX_GPIO, HI_IO_FUNC_GPIO_1_UART1_RXD);

    // ret
    hi_uart_idx id = BEIDOU_UART_IDX;
    param.baud_rate = 9600; // 初始化波特率
    param.data_bits = 8;    // 数据位
    param.stop_bits = 1;    // 停止位
    // param.parity = 0 ;//奇偶校验位
    // param.pad = 0 ;// reserved pad

    hi_uart_init(id, &param, &extra_att);
}

// void helloUart(void)
// {
//     printf("Hello Uart\n");
//     InitUart() ;
//     UartTestSample();
// }

// 入口函数
// static void helloUartEntry(void )
// {

//     // 定义线程属性
//     osThreadAttr_t attr;
//     attr.name = "helloUart";
//     attr.attr_bits = 0U;
//     attr.cb_mem = NULL;
//     attr.cb_size = 0U;
//     attr.stack_mem = NULL;
//     attr.stack_size = 10240;
//     attr.priority = osPriorityNormal;

//     // 创建线程
//     if (osThreadNew(helloUart, NULL, &attr) == NULL)
//     {
//         printf("[uartDemoEntry] Falied to create helloUart!\n");
//     }
// }

// SYS_RUN(helloUartEntry);